package com.atguigu.jxc.service.impl;

import com.atguigu.jxc.dao.GoodsTypeDao;
import com.atguigu.jxc.domain.ErrorCode;
import com.atguigu.jxc.domain.ServiceVO;
import com.atguigu.jxc.domain.SuccessCode;
import com.atguigu.jxc.entity.GoodsType;
import com.atguigu.jxc.entity.Log;
import com.atguigu.jxc.service.GoodTypeService;
import com.atguigu.jxc.service.LogService;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.sun.org.apache.bcel.internal.generic.RETURN;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * ClassName: GoodTypeServiceImpl
 * Package: com.atguigu.jxc.service.impl
 *
 * @Description:
 * @Author: xvyy
 * @Create: 2025/2/21 - 16:16
 * @Version: v1.0
 */
@Service
public class GoodTypeServiceImpl implements GoodTypeService {

    @Autowired
    private GoodsTypeDao goodsTypeDao;
    @Autowired
    private LogService logService;

    @Override
    public String loadGoodsType() {
        return this.getGoodsTypeByParentId(-1, new HashSet<>()).toString(); // 根节点默认从-1开始
    }


    @Override
    public ServiceVO save(String goodsTypeName, Integer pId) {
        // 验证输入参数
        if (goodsTypeName == null || goodsTypeName.trim().isEmpty()) {
            return new ServiceVO<>(ErrorCode.PARA_TYPE_ERROR_CODE, ErrorCode.PARA_TYPE_ERROR_MESS);
        }
        if (pId == null) {
            return new ServiceVO<>(ErrorCode.PARA_TYPE_ERROR_CODE, ErrorCode.PARA_TYPE_ERROR_MESS);
        }
        // 创建新的商品分类
        GoodsType goodsType = new GoodsType();
        goodsType.setGoodsTypeName(goodsTypeName);
        goodsType.setGoodsTypeState(0); // 默认状态为叶子节点
        goodsType.setPId(pId);
        // 保存商品分类
        goodsTypeDao.save(goodsType);
        // 记录日志
        logService.save(new Log(Log.INSERT_ACTION, "保存商品分类: " + goodsTypeName));
        // 返回成功结果
        return new ServiceVO<>(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
    }

    @Override
    public ServiceVO delete(Integer goodsTypeId) {
        // 验证输入参数
        if (goodsTypeId == null) {
            return new ServiceVO<>(ErrorCode.PARA_TYPE_ERROR_CODE, ErrorCode.PARA_TYPE_ERROR_MESS);
        }
        // 检查是否有子菜单
        List<GoodsType> children = goodsTypeDao.getGoodsTypeByParentId(goodsTypeId);
        if (!children.isEmpty()) {
            return new ServiceVO<>(ErrorCode.GOODS_TYPE_ERROR_CODE, ErrorCode.GOODS_TYPE_ERROR_MESS);
        }
        // 删除商品分类
        goodsTypeDao.delete(goodsTypeId);
        // 记录日志
        logService.save(new Log(Log.DELETE_ACTION, "删除商品分类: " + goodsTypeId));

        // 返回成功结果
        return new ServiceVO<>(SuccessCode.SUCCESS_CODE, SuccessCode.SUCCESS_MESS);
    }

    @Override
    public GoodsType findGoodsTypeById(Integer goodsTypeId) {
        return goodsTypeDao.findGoodsTypeById(goodsTypeId);
    }

    /**
     * 根据父菜单ID获取菜单
     *
     * @param parentId 父菜单ID
     * @param visited  已访问的菜单ID集合，防止死循环
     * @return JSON数组
     */
    public JsonArray getGoodsTypeByParentId(Integer parentId, Set<Integer> visited) {
        JsonArray array = new JsonArray();
        // 检查是否已经访问过该节点，防止死循环
        if (visited.contains(parentId)) {
            return array;
        }
        visited.add(parentId);
        List<GoodsType> goodsTypeList = goodsTypeDao.getGoodsTypeByParentId(parentId);
        // 遍历菜单集合
        for (GoodsType goodsType : goodsTypeList) {
            JsonObject obj = new JsonObject();
            obj.addProperty("id", goodsType.getGoodsTypeId()); // 菜单ID
            obj.addProperty("text", goodsType.getGoodsTypeName()); // 菜单名称
            if (goodsType.getGoodsTypeState() == 1) {
                obj.addProperty("state", "closed"); // 根节点
            } else {
                obj.addProperty("state", "open"); // 叶子节点
            }
            JsonObject attributes = new JsonObject(); // 扩展属性
            attributes.addProperty("state", goodsType.getGoodsTypeState());
            obj.add("attributes", attributes);
            // 递归获取子菜单
            JsonArray children = this.getGoodsTypeByParentId(goodsType.getGoodsTypeId(), visited);
            if (children.size() > 0) {
                obj.add("children", children);
            }
            array.add(obj);
        }
        return array;
    }
}
